<!doctype html>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="../assert_selection.js"></script>
<script>
function doubleClick(x, y) {
    eventSender.leapForward(1000);
    eventSender.mouseMoveTo(x, y);
    eventSender.mouseDown();
    eventSender.mouseUp();
    eventSender.mouseDown();
    eventSender.mouseUp();
}

function doubleClickIn(selection, selector) {
    const element = selection.document.querySelector(selector);
    const mouseX = element.offsetLeft + 5 + selection.document.offsetLeft;
    const mouseY = element.offsetTop + 5 + selection.document.offsetTop;
    doubleClick(mouseX, mouseY);
}

test(() => {
    assert_not_equals(window.eventSender, undefined,
        'This test requires eventSender');

    assert_not_equals(window.internals, undefined,
        'This test requires internals');

    internals.settings.setSmartInsertDeleteEnabled(true);

    [true, false].forEach(selectTrailingWhitespaceEnabled => {
        internals.settings.setSelectTrailingWhitespaceEnabled(selectTrailingWhitespaceEnabled);
        const withOrWithout = selectTrailingWhitespaceEnabled ? 'with' : 'without';

        assert_selection(
            '<div contenteditable>test</div>',
            selection => {
                doubleClickIn(selection, 'div');
                selection.document.execCommand('copy');
                selection.modify('move', 'forward', 'character');
                selection.document.execCommand('paste');
            },
            '<div contenteditable>test\u{00A0}test|</div>',
            `1 Smart paste at end of word ${withOrWithout} trailing whitespace`);

        assert_selection(
            '<div contenteditable>test</div>',
            selection => {
                doubleClickIn(selection, 'div');
                selection.document.execCommand('copy');
                selection.modify('move', 'backward', 'word');
                selection.document.execCommand('paste');
            },
            '<div contenteditable>test |test</div>',
            `2 Smart paste at start of word ${withOrWithout} trailing whitespace`);

        assert_selection(
            '<div contenteditable>foo bar</div>',
            selection => {
                doubleClickIn(selection, 'div');
                selection.document.execCommand('copy');
                selection.modify('move', 'forward', 'character');
                if (selectTrailingWhitespaceEnabled)
                    selection.modify('move', 'backward', 'character');
                selection.document.execCommand('paste');
            },
            selectTrailingWhitespaceEnabled
                ? '<div contenteditable>foo\u{00A0}foo\u{00A0}|\u{00A0}bar</div>'
                : '<div contenteditable>foo\u{00A0}foo|\u{00A0}bar</div>',
            `3 Smart paste when pasting after a word and before a space and another word ${withOrWithout} trailing whitespace`);

        assert_selection(
            '<div contenteditable>foo bar</div>',
            selection => {
                doubleClickIn(selection, 'div');
                selection.document.execCommand('copy');
                selection.modify('move', 'forward', 'character');
                if (!selectTrailingWhitespaceEnabled)
                    selection.modify('move', 'forward', 'character');
                selection.document.execCommand('paste');
            },
            selectTrailingWhitespaceEnabled
                ? '<div contenteditable>foo foo\u{00A0} |bar</div>'
                : '<div contenteditable>foo foo |bar</div>',
            `4 Smart paste when pasting after word and a space before another word ${withOrWithout} trailing whitespace`);

        assert_selection(
            '<div contenteditable>abcd</div>',
            selection => {
                doubleClickIn(selection, 'div');
                selection.document.execCommand('copy');
                selection.modify('move', 'backward', 'word');
                selection.modify('move', 'forward', 'character');
                selection.document.execCommand('paste');
            },
            '<div contenteditable>a\u{00A0}abcd |bcd</div>',
            `5 Smart paste when pasting in the middle of a word ${withOrWithout} trailing whitespace`);

        assert_selection(
            '<div contenteditable>abcd</div>',
            selection => {
                doubleClickIn(selection, 'div');
                selection.document.execCommand('delete');
                selection.document.execCommand('insertText', false, '--');
                selection.modify('move', 'backward', 'character');
                selection.document.execCommand('paste');
            },
            '<div contenteditable>-abcd|-</div>',
            `6 Smart paste when pasting between smart paste exempt characters ${withOrWithout} trailing whitespace`);

        assert_selection(
            '<div contenteditable>abcd</div>',
            selection => {
                doubleClickIn(selection, 'div');
                selection.document.execCommand('delete');
                selection.document.execCommand('insertText', false, '..');
                selection.modify('move', 'backward', 'character');
                selection.document.execCommand('paste');
            },
            '<div contenteditable>.\u{00A0}abcd|.</div>',
            `7 Smart paste when pasting between two periods ${withOrWithout} trailing whitespace`);
    });
}, 'Smart Paste');
</script>
